Node3D 插件示例
示例展示了如何在 Kanzi Studio 中创建自定义的 3D 节点以及如何使用该节点。Kanzi 示例包含 Visual Studio 解决方案,它定义用于定义自定义节点的 Kanzi Engine 插件的 .dll;还包含一个 Kanzi Studio 工程,它使用插件系统在 Kanzi Studio 预览 (Preview) 中应用自定义节点中定义的行为。
您可以在 <KanziWorkspace>/Examples/Node3D_plugin 目录中找到本示例。
要了解如何创建Kanzi Engine 插件,请参阅创建 Kanzi Engine 插件。
创建自定义节点
示例中的两个自定义节点为:
- 旋钮会发送有关旋钮当前旋转角度的消息,以响应用户的输入。它会根据用户的输入(平移手势)生成自己的消息。旋钮 (Knob) 生成在 Kanzi Studio 下中 Knob 上拦截的以下消息类型:
- 通过直接将参数传送给 Z 旋转角度特性,将旋钮的旋转角度转发给旋钮的外部可视化。
- 生成应用程序事件(也称为消息)并将其传送给下拉列表节点,以处理离散水平更新。
- 转盘 (Spinner) 通过将文本块 (Text Block) 节点的文本 (Text) 属性更新以显示旋钮 (Knob) 的值,从而对消息作出反应。它从外部接收消息,并基于自身所定义的行为来响应消息。
Kanzi Studio 从插件 dll 中读取自定义节点使用的消息和属性类型的相关信息。
Kanzi Engine 使用插件中的签名调用一个函数,以注册插件
extern "C"
{
__declspec(dllexport) Module* createModule(uint32_t kanziVersionMajor, uint32_t kanziVersionMinor);
}
旋钮 (Knob) 和转盘 (Spinner) 节点在您创建并由 createModule() 函数返回的模块中定义的 getMetaclassesOverride() 函数中注册。
为了注册转盘 (Spinner) 节点,转盘 (Spinner) 必须包含一个元类。通过使用 KZ_METACLASS_BEGIN,您定义自定义节点并声明:
- 基类 (
Node3D) - 唯一 ID (
"Spinner") - 它使用的消息 (
SpinnerUpdateLevelMessage) - 它使用的属性类 (
TextBlockProperty)
KZ_METACLASS_BEGIN(Spinner, Node3D, "Spinner")
KZ_METACLASS_MESSAGE_TYPE(SpinnerUpdateLevelMessage)
KZ_METACLASS_PROPERTY_TYPE(TextBlockProperty)
KZ_METACLASS_END()
在本示例中,转盘 (Spinner) 创建其消息类型 SpinnerUpdateLevelMessage,指定其使用 SpinnerUpdateLevelMessageArguments。
MessageType<Spinner::SpinnerUpdateLevelMessageArguments> Spinner::SpinnerUpdateLevelMessage(kzMakeFixedString("Message.Spinner.UpdateLevel"),
KZ_DECLARE_EDITOR_METADATA
(
//将消息名称设置为 Kanzi Studio 中显示的方式。
metadata.displayName = "Update Spinner Level";
//设置消息的工具提示。
metadata.tooltip = "Updates the Spinner level and outputs the level to a text block.";
//不将消息显示为触发器。
//要在 Kanzi Studio 中将消息显示为动作,请执行此代码。
metadata["Listenable"] = "False";
));
为了注册 SpinnerUpdateLevelMessage 的消息参数,SpinnerUpdateLevelMessageArguments 必须包含定义消息参数的元类。通过使用 KZ_MESSAGE_ARGUMENTS_METACLASS_BEGIN,您定义自定义消息的参数并声明:
- 基类 (
MessageArguments) - 唯一 ID (
"Spinner Update Level Message Arguments") - 属性类型 (
SpinnerLevelAlterationProperty)
KZ_MESSAGE_ARGUMENTS_METACLASS_BEGIN(SpinnerUpdateLevelMessageArguments, MessageArguments, "Spinner Update Level Message Arguments")
KZ_METACLASS_PROPERTY_TYPE(SpinnerLevelAlterationProperty)
KZ_METACLASS_END()